/*
 *  Copyright (C) 2011 JiangHongTiao <jjurco.sk_gmail.com>
 * 
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package sk.lieskove301.jianghongtiao.liaad.prisoner.payoff;

import java.util.ArrayDeque;
import java.util.Deque;
import sk.lieskove301.jianghongtiao.liaad.prisoner.strategy.FightResultEnum;

/**
 * Date of create: May 15, 2011
 *
 * @author JiangHongTiao <jjurco.sk_gmail.com>
 * @version 2011.0515
 */
public class PayoffCooperateWin implements PayoffValue{

    public Deque<Double> countPayoffValues(FightResultEnum result) {
        if(result == FightResultEnum.BothCooperate)   return bothCooperate();
        if(result == FightResultEnum.CooperateBetray) return cooperateBetray();
        if(result == FightResultEnum.BetrayCooperate) return betrayCooperate();
        if(result == FightResultEnum.BothBetray)      return bothBetray();
        throw new IllegalStateException("Shit happened!");
    }

    private Deque<Double> cooperateBetray(){
        Deque<Double> values = new ArrayDeque<Double>(2);
        values.addFirst(new Double(-10));//betray
        values.addFirst(new Double(1));//cooperation
        return values;
    }

    private Deque<Double> betrayCooperate(){
        Deque<Double> values = new ArrayDeque<Double>(2);
        values.addFirst(new Double(1));//cooperation
        values.addFirst(new Double(-10));//betray
        return values;
    }

    private Deque<Double> bothCooperate(){
        Deque<Double> values = new ArrayDeque<Double>(2);
        Double val = 10.0;
        values.addFirst(val);
        values.addFirst(val);
        return values;
    }

    private Deque<Double> bothBetray(){
        Deque<Double> values = new ArrayDeque<Double>(2);
        Double val = -10.0;
        values.addFirst(val);
        values.addFirst(val);
        return values;
    }
}
